Sqlite内存分配先关函数:SQLite需要动态分配一块内存时,它通常是调用底层操作系统默认的内存处理函数,使SQLite从应用程序堆中分配内存。然而,程序员可以通过sqlite3_config函数配置SQLite,使其进行自己的内部的内存管理。这对于嵌入式和手持终端等内存受限的设备来说非常重要,过度分配内存会给系统稳定性带来问题。下面是结构体及函数功能列表,如下表所示
表2.4.1 结构体功能列表
编号 | 结构体名称 | 功能 |
---|---|---|
1 | MemBlockHdr | 内存分配结构 |
表2.4.2 mem0-2.c函数功能列表
编号 | 函数名 | 功能 |
---|---|---|
1 | static void *sqlite3MemMalloc(int nByte) | 在内存的动态分配存储区中分配一块长度为nByte字节的连续区域,参数nByte为需要内存空间的长度,返回该区域的首地址。 |
2 | static void sqlite3MemFree(void *pPrior) | 释放pPrior指向的存储空间,被释放的空间通常被送入可用存储区域,以后可在调用malloc、realloc函数来再分配。 |
3 | Static void sqlite3MemRealloc(void pPrior, int nByte) | 给一个已经分配了地址的指针重新分配空间,参数pPrior为原有空间地址,nByte是重新申请的地址长度。 |
4 | static int | 函数返回已分配内存的大小,也能够跟踪未归还内存的字节数,它能确定当一个分配被释放时有多少字节从未归还内存中移除。 |
sqlite3MemSize(void *p) | ||
5 | static int sqlite3MemRoundup(int n) | 函数返回下一个有效内存分配的大小。 |
6 | static int sqlite3MemInit(void *NotUsed) | 函数初始化 |
7 | void sqlite3MemSetDefault(void) | 函数填充底层的内存分配函数指针 |
8 | static void sqlite3MemShutdown(void *NotUsed) | 取消函数的初始化 |
9 | static struct MemBlockHdr sqlite3MemsysGetHeader(void pAllocation) | 函数设置哨兵对内存破坏进行检查 |
10 | static void randomFill(char *pBuf, int nByte) | 函数填充伪随机字节的缓冲区,预留一个内存分配到不可预测值并清除释放不可预测值的内容。 |
11 | void sqlite3MemdebugSetType | 设置内存分配的类型 |
(void *p, u8 eType) | ||
12 | int sqlite3MemdebugHasType(void *p, u8 eType) | 函数使用assert()语句验证内存分配的类型 |
13 | int sqlite3MemdebugNoType(void *p, u8 eType) | 验证内存分配的类型 |
14 | void sqlite3MemdebugBacktrace | 函数设置每个内存分配回溯跟踪级别数 |
(int depth) | ||
15 | void sqlite3MemdebugBacktraceCallback(void (xBacktrace)(int, int, void *)) | 函数内存分配的回调函数 |
16 | void sqlite3MemdebugSettitle(const char *zTitle) | 函数设置标题字符串进行后续的分配 |
17 | void sqlite3MemdebugSync() | 函数同步 |
18 | void sqlite3MemdebugDump(const char *zFilename) | 函数打印调用栈 |
19 | int sqlite3MemdebugMallocCount() | 函数返回sqlite3MemdebugMalloc()被调用的次数 |
20 | extern int backtrace(void**,int) | 函数用于获取当前线程的调用堆栈,获取的信息将会被存在指针数组中,函数返回值是实际获取的指针的个数。 |
21 | extern void backtrace_symbols_fd(voidconst,int,int) | 从backtrace函数获取的信息转化为一个字符串数组,函数返回将结果写入文件描述符为fd的文件中,每个函数对应一行。 |
Mem0.c是空操作的内存分配器,函数分配的结果返回0,比较简单没有实际运用的价值,但是他可以链接一些自定义的内存分配器函数。Mem1.c是缺省内存分配器,所使用的内存分配函数都是C语言标准库中的内存分配函数,在没有特别指明的情况下,SQLite会自动调用系统这个内存分配器。Mem2.c是调试内存分配器,这个内存分配器运用较少,因为这个内存分配器的速度较慢,一般不常用。但是如果这个内存分配器被激活的话,它有一些其他的检查功能。